<?php

namespace app\index\controller;

use app\index\model\Image;
use app\common\NormalException;

/**
 * 正式Clism应用需要使用的Formal类
 * @author 丁浩然 <dinghaoran@tiaozhan.com>
 */
class Formal
{
    /**
     * clism图像风格迁移
     */
    public function clism()
    {
        // 获取传入的参数
        $req = request()->param();
        if (!isset($req['image']) || !isset($req['style'])) {
            error('参数不全');
        }
        // 生成随机码
        $code = md5(uniqid());
        // 生成上传的原图片
        $image = $req['image'];
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $image, $result)) {
            // 匹配出图片的格式
            $type = $result[2];
            $file = 'input/' . $code . ".{$type}";
            if (file_put_contents($file, base64_decode(str_replace($result[1], '', $image)))) {
                // 成功生成图片
            } else {
                error('生成图片失败，疑似无法写入指定文件');
            }
        } else {
            error('生成图片失败，疑似base64编码不合法');
        }

        // 完成图像风格迁移
        $model = Image::$STYLE_RELATION[$req['style']];
        $file = $code . '.' . $type;
        `python ../tensorflow/eval.py --model_file ../tensorflow/models/{$model}.ckpt-done --input_file input/{$file} --output_file output/{$file}`;

        // 文件路径
        $file = 'output/' . $code . '.' . $type;
        if (!file_exists($file)) {
            error('生成图像不存在');
        } else {
            $imageFile = fopen($file, 'r');
            if ($imageFile) {
                $filesize = filesize($file);
                $content = fread($imageFile, $filesize);
                // 生成base64编码
                $imageContent = chunk_split(base64_encode($content));
            }
            fclose($imageFile);
        }
        return success(['image' => $imageContent]);
    }
}
